#include "Nucleo.h"
#include "NucleoRoundRobin.h"
#include "NucleoPrioridade.h"
#include "BCP.h"
#include <iostream>
#include <stdio.h>
#include <string>

int
main( int argc, char* argv[] )
{	
	Nucleo*
	kernel;
	
	int
	quantum;
	
	int
	i,j, p;
	
	int
	qtdeProcessos;
	
	char
	c;
	
	char
	aux[12];
	
	FILE* 
	fptr;
	
	if( ( fptr = fopen( argv[1], "r" ) ) == NULL )
	{
		std::cout << "impossivel abrir arquivo de leitura" << std::endl;
	}
	
	fscanf( fptr, "%c\n", &c );
	
	if( c == 'r' )
	{
		kernel = new NucleoRoundRobin;
	}
	else
	{
		kernel = new NucleoPrioridade;
	}
	
	fscanf( fptr, "quantum\n%d\n", &quantum );
	
	kernel->setTempo( quantum );
	
	fscanf( fptr, "%s\n", aux ); //Dispositivos
	
	fscanf( fptr, "%c", &c );
	
	char
	a[2];
	
	while( c != 'Q' )
	{
		a[0] = c;
		a[1] = '\0';
		i = atoi( a ); //qtde de dispositivos
		fscanf( fptr, " %c\n", &c ); //dispositivo
		kernel->insereDispositivo( c, i );
		fscanf( fptr, "%c", &c );
	}
	
	while( c != '\n' )
	{
		fscanf( fptr, "%c", &c );
	}
	
	fscanf( fptr, "%d\n", &qtdeProcessos );
	
	BCP*
	processo;
	
	fscanf( fptr, "%s", aux ); //Processo
	
	fscanf( fptr, " %d\n", &p); //prioridade
	
	fscanf( fptr, "%s", aux); //primeira tarefa
	
	for( i = 0; i < qtdeProcessos; i++ )
	{
		processo = new BCP;
		processo->setCodigo( i );
		processo->setPrioridade( p );
		while( ( strcmp( aux, "Processo") != 0 ) && !feof(fptr) )
		{
			if( strcmp( aux, "CPU" ) == 0 )
			{
				fscanf( fptr, "%d\n", &j );
				processo->inserirTarefas( '0', j );
			}
			else if( strcmp( aux, "IO" ) == 0 )
			{
				fscanf( fptr, " %c %d\n", &c, &j );
				processo->inserirTarefas( c, j );
			}
			fscanf( fptr, "%s", aux);
		}
		kernel->insereListaPronto(*processo);
		delete processo;
		fscanf( fptr, " %d\n", &p);
		fscanf( fptr, "%s", aux);
	}
	
	kernel->executa();
	std::cout << "Clock usado: " << kernel->getClock() << std::endl;
	std::cout << "Ocioso: " << kernel->getOcioso() << std::endl;
	
	fclose(fptr);
	
	return 0;
}
